home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / + TYLKO W WERSJI CYFROWEJ + / PCWK_PROG / Source / 120 / ukryte5 / fukryte5.cpp next >
C/C++ Source or Header  |  2007-07-05  |  8KB  |  284 lines

  1. //
  2. //  Andrzej Stasiewicz, czerwiec, 2007
  3. //  Dekodowanie obrazu ukrytego w wbrazie z kontrol╣ identyfikatora
  4. //---------------------------------------------------------------------------
  5. #include <vcl.h>
  6. #pragma hdrstop
  7.  
  8. #include "fukryte5.h"
  9. //---------------------------------------------------------------------------
  10. #pragma package(smart_init)
  11. #pragma resource "*.dfm"
  12. TForm1 *Form1;
  13. //---------------------------------------------------------------------------
  14. __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
  15. {
  16. }
  17. //---------------------------------------------------------------------------
  18. //  Odczyt pliku, wy£wietlenie z lewej strony.
  19. //  Odczyt parametr≤w z nag│≤wka
  20. void __fastcall TForm1::Button1Click(TObject *Sender)
  21. {
  22.  if( OpenPictureDialog1 -> Execute())
  23.  {
  24.     Image1 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
  25.     Image1 -> Picture -> Bitmap -> PixelFormat = pf32bit;
  26.  
  27.     odczytaj_naglowek();
  28.  }    
  29. }
  30. //---------------------------------------------------------------------------
  31. //  Deszyfracja z kontrol╣ has│a
  32. void __fastcall TForm1::Button2Click(TObject *Sender)
  33. {
  34.  int i, j;
  35.  TColor k;
  36.  int bajt;
  37.  unsigned char r, g, b;
  38.  
  39.  if( !odczytaj_naglowek())          //na wszelki wypadek jeszcze raz przeczytajmy ...
  40.     return;
  41.  
  42.  int twoj_id = Edit1 -> Text.ToInt();
  43.  
  44.  if( twoj_id != id)
  45.  {
  46.     Application -> MessageBox( "Nie ma ukrytego obrazu albo z│y identyfikator.", "Uwaga ...", MB_OK);
  47.     return;
  48.  }
  49.  
  50.  Label2 -> Caption = "Rozmiar: " + String( s) + " x " + String( w);
  51.  Label3 -> Caption = "Bity RGB: " + String( il_r) + " - " + String( il_g) + " - " + String( il_b);
  52.  
  53.  Image2 -> Picture -> Bitmap -> Width  = s;
  54.  Image2 -> Picture -> Bitmap -> Height = w;
  55.  Image2 -> Picture -> Bitmap -> PixelFormat = pf32bit;
  56.  
  57.  for( i = 0; i < s; ++i)
  58.  {
  59.     for( j = 0; j < w; ++j)
  60.     {
  61.         r = g = b = 0;
  62.         
  63.         bajt = odczytaj_bajt();
  64.         if( bajt == -1)
  65.             return;
  66.         r = bajt;
  67.  
  68.         bajt = odczytaj_bajt();
  69.         if( bajt == -1)
  70.             return;
  71.         g = bajt;
  72.  
  73.         bajt = odczytaj_bajt();
  74.         if( bajt == -1)
  75.             return;
  76.         b = bajt;
  77.         
  78.         k = RGB( r, g, b);
  79.         Image2 -> Picture -> Bitmap -> Canvas -> Pixels[ i][ j] = k;
  80.     }
  81.  }
  82. }
  83. //---------------------------------------------------------------------------
  84. //  Zapis zdeszyfrowanego obrazka do pliku
  85. void __fastcall TForm1::Button3Click(TObject *Sender)
  86. {
  87.  if( SavePictureDialog1 -> Execute())
  88.  {
  89.     Image2 -> Picture -> SaveToFile( SavePictureDialog1 -> FileName);
  90.  }    
  91. }
  92. //---------------------------------------------------------------------------
  93. //  Funkcja elementarna.
  94. //  oddaj stan 0, 1, zgodnie z bitem poz w bajcie bajt
  95. int TForm1 :: daj_bit( unsigned char bajt, int poz)
  96. {
  97.  int bit;
  98.  unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128};   //binarnie: '1', '10', '100', '1000', ...
  99.  
  100.  if( bajt & maska[ poz])
  101.     bit = 1;
  102.  else
  103.     bit = 0;
  104.  return bit;
  105. }
  106. //---------------------------------------------------------------------------
  107. //  Funkcja elementarna.
  108. //  W bajcie 'bajt' nadaj bitowi 'poz' wartosc 'bit'
  109. unsigned char TForm1 :: ustaw_bit( unsigned char bajt, int poz, int bit)
  110. {
  111.  unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128};   //'1', '10', '100', '1000', ...
  112.  
  113.  if( bit == 1)          //wpisywanie jedynki
  114.  {
  115.     bajt = bajt | maska[ poz];
  116.  }
  117.  else
  118.  {
  119.     bajt = bajt & (~maska[ poz]);
  120.  }
  121.  return bajt;
  122. }
  123. //---------------------------------------------------------------------------
  124. //  Odczytaj wartosc bit (=0, 1) w bie┐╣cym bicie obrazka g│≤wnego Image1
  125. //  Dokonaj przesuniΩcia wskaƒnik≤w pozycji bie┐╣cego bitu
  126. //  return: 0, 1 - warto£µ bitu, 
  127. //          -1 - koniec obrazka.
  128. int TForm1 :: odczytaj_bit( void)
  129. {
  130.  int bit;
  131.  int szer = Image1 -> Picture -> Bitmap -> Width;
  132.  int wys  = Image1 -> Picture -> Bitmap -> Height;
  133.  
  134.  if( Y_POZ > wys)
  135.     return -1;                       //koniec obrazka - no£nika
  136.    
  137.  TColor k = Image1 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ];
  138.  unsigned char r = GetRValue( k);
  139.  unsigned char g = GetGValue( k);
  140.  unsigned char b = GetBValue( k);
  141.  
  142.  switch( RGB_POZ)
  143.  {
  144.   case 0:
  145.             bit = daj_bit( r, BIT_POZ);
  146.             break;
  147.   case 1:
  148.             bit = daj_bit( g, BIT_POZ);
  149.             break;
  150.   case 2:
  151.             bit = daj_bit( b, BIT_POZ);
  152.             break;
  153.  }
  154.  
  155.  BIT_POZ ++;                        //nastΩpny wskaƒniki na nastΩpny bit ...
  156.  
  157.  if( RGB_POZ == 0)                  //... ale czy mie£ci siΩ w kanale R?
  158.  {
  159.     if( BIT_POZ >= il_r)
  160.     {
  161.         BIT_POZ = 0;
  162.         RGB_POZ = 1;                //... je£li nie, przejdƒmy do kana│u G...
  163.     }
  164.  }
  165.  
  166.  if( RGB_POZ == 1)                  //... ale czy mie£ci siΩ w kanale G? ...
  167.  {
  168.     if( BIT_POZ >= il_g)
  169.     {
  170.         BIT_POZ = 0;
  171.         RGB_POZ = 2;                //... je£li nie, przejdƒmy do kana│u B ...
  172.     }
  173.  }
  174.  
  175.  if( RGB_POZ == 2)                  //... ale czy mie£ci siΩ w kanale B? ...
  176.  {
  177.     if( BIT_POZ >= il_b)
  178.     {
  179.         BIT_POZ = 0;
  180.         RGB_POZ = 0; 
  181.         X_POZ ++;                   //... je£li nie, przejdƒmy do nastΩpnego piksela
  182.         if( X_POZ >= szer)
  183.         {
  184.             X_POZ = 0;
  185.             Y_POZ ++;
  186.         }
  187.     }
  188.  }
  189.  return bit;
  190. }
  191. //---------------------------------------------------------------------------
  192. //  8-krotne wywo│anie powy┐szej odczytaj_bit()
  193. //  gdy ret = -1 b│╣d czytania (koniec obrazka - no£nika)
  194. int TForm1 :: odczytaj_bajt( void)
  195. {
  196.  unsigned char bajt = 0;
  197.  int i, bit;
  198.  
  199.  for( i = 0; i < 8; ++i)
  200.  {
  201.     bit = odczytaj_bit();
  202.     if( bit == -1)
  203.         return -1;
  204.     bajt = ustaw_bit( bajt, i, bit);
  205.  }
  206.  return bajt;
  207. }
  208. //---------------------------------------------------------------------------
  209. //  Odczytanie kodu rozpoznawczego, szerokosci, wysokosci i ilosci wykradanych bit≤w
  210. //  Uwaga - nag│≤wek jest zapisywany zawsze na 2 bitach w kana│ach R, G, B
  211. //  Pod koniec nag│≤wka przechodzimy na warto£ci zapisane w nag│≤wku
  212. bool TForm1 :: odczytaj_naglowek( void)
  213. {
  214.  X_POZ = 0;                             //start
  215.  Y_POZ = 0;
  216.  RGB_POZ = 0;
  217.  BIT_POZ = 0;
  218.  
  219.  il_r = il_g = il_b = 2;                //umowa - nag│≤wek wykrada ZAWSZE po 2 bity
  220.  
  221.  int bajt;
  222.  unsigned char id_hi, id_lo;        
  223.  unsigned char s_hi, s_lo, w_hi, w_lo;
  224.  unsigned char il_ra, il_ga, il_ba;
  225.  
  226.  id_hi = id_lo = s_hi = s_lo = w_hi = w_lo = il_ra = il_ga = il_ba = 0;
  227.  
  228.  bajt = odczytaj_bajt();
  229.  if( bajt == -1)
  230.     return false;
  231.  id_hi = bajt;
  232.  
  233.  bajt = odczytaj_bajt();
  234.  if( bajt == -1)
  235.     return false;
  236.  id_lo = bajt;
  237.  id = (id_hi << 8) + id_lo;               //z│o┐enie dw≤ch bajt≤w
  238.  
  239.  bajt = odczytaj_bajt();
  240.  if( bajt == -1)
  241.     return false;
  242.  s_hi = bajt;
  243.  
  244.  bajt = odczytaj_bajt();
  245.  if( bajt == -1)
  246.     return false;
  247.  s_lo = bajt;
  248.  s = (s_hi << 8) + s_lo;                 //z│o┐enie dw≤ch bajt≤w. Uwaga na priorytety i nawiasy!
  249.  
  250.  bajt = odczytaj_bajt();
  251.  if( bajt == -1)
  252.     return false;
  253.  w_hi = bajt;
  254.  
  255.  bajt = odczytaj_bajt();
  256.  if( bajt == -1)
  257.     return false;
  258.  w_lo = bajt;
  259.  w = (w_hi << 8) + w_lo;                 //z│o┐enie dw≤ch bajt≤w
  260.  
  261.  bajt = odczytaj_bajt();
  262.  if( bajt == -1)
  263.     return false;
  264.  il_ra = bajt;
  265.  
  266.  bajt = odczytaj_bajt();
  267.  if( bajt == -1)
  268.     return false;
  269.  il_ga = bajt;
  270.  
  271.  bajt = odczytaj_bajt();
  272.  if( bajt == -1)
  273.     return false;
  274.  il_ba = bajt;
  275.  
  276.  il_r = il_ra;                          //koniec umowy co do bitowej struktury nag│≤wka
  277.  il_g = il_ga;
  278.  il_b = il_ba;
  279.  
  280.  return true;
  281. }
  282. //---------------------------------------------------------------------------
  283.  
  284.